package com.hospital.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hospital.entity.Schedule;
import com.hospital.vo.DoctorScheduleVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 排班服务接口
 *
 * @author Hospital Management System
 */
public interface ScheduleService extends IService<Schedule> {

    /**
     * 获取医生排班列表（医生端用）
     */
    List<Schedule> getDoctorSchedules(Long doctorId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取医生当前排班
     */
    List<Schedule> getCurrentDoctorSchedules(Long doctorId);

    /**
     * 更新排班状态（医生可用）
     */
    void updateScheduleStatus(Long scheduleId, Integer status, String remark);

    /**
     * 获取全院排班列表（管理员用）
     */
    List<Schedule> getAllSchedules(LocalDate startDate, LocalDate endDate);

    /**
     * 分页获取排班列表（管理员用）
     */
    Map<String, Object> getSchedulesWithPagination(Long departmentId, Integer status, 
                                                   LocalDate startDate, LocalDate endDate, 
                                                   Integer page, Integer size);

    /**
     * 按科室获取排班
     */
    List<Schedule> getSchedulesByDepartment(Long departmentId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取排班统计（管理员用）
     */
    Map<String, Object> getScheduleStatistics(LocalDate startDate, LocalDate endDate);

    /**
     * 创建排班（管理员用）
     */
    void createSchedule(Schedule schedule);

    /**
     * 更新排班（管理员用）
     */
    void updateSchedule(Schedule schedule);

    /**
     * 批量创建排班（管理员用）
     */
    void batchCreateSchedules(List<Schedule> schedules);

    /**
     * 删除排班（管理员用）
     */
    void deleteSchedule(Long scheduleId);

    /**
     * 检查排班冲突
     */
    boolean hasConflict(Long doctorId, LocalDate date, Integer timeSlot);

    /**
     * 获取医生工作量统计
     */
    Map<String, Object> getDoctorWorkload(Long doctorId, LocalDate startDate, LocalDate endDate);

    /**
     * 统计今日在岗医生数量
     */
    long countActiveDoctorsToday();

    /**
     * 获取指定科室和日期的排班信息
     *
     * @param date 日期
     * @param departmentId 科室ID
     * @return 医生排班信息列表
     */
    List<DoctorScheduleVO> getSchedulesByDateAndDepartment(LocalDate date, Long departmentId);
} 